/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package imat.data;

import java.awt.Dimension;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
import javax.swing.ImageIcon;
import se.chalmers.cse.dat215.project.IMatDataHandler;
import se.chalmers.cse.dat215.project.Product;
import se.chalmers.cse.dat215.project.ProductCategory;

public class IMatHandlerExtended{

    public static IMatDataHandler handler;
    private static IMatHandlerExtended instance;

    private List<Product> favorites = new LinkedList<Product>();

    protected IMatHandlerExtended(){}
    


    /**
     * Favoriter:
     * vi ska kunna sätta produkter till favoriter
     * vi ska kunna ta bort produkter från favoriter
     * Avgöra om en produkt är en favorit (isFavorit)
     *
     *
     *
     */

    /**
     *
     *
     *
     * @param p Produkten som ska läggas till som favorit
     */
    public void addFavorite(Product p) {
        if (!favorites.contains(p)) {
            favorites.add(p);
        }
    }

    public void removeFavorite(Product p){
        if(favorites.contains(p))
            favorites.remove(p);
    }

    public boolean isFavorite(Product p) {
        return favorites.contains(p);
    }

    private void loadFavorites(){
        // ladda favoritlistan
        BufferedReader r = null;

        try {
             r = new BufferedReader(new FileReader(handler.imatDirectory()+"/favorites.txt"));

             String line = null;
             while((line = r.readLine()) != null){
                favorites.add(handler.getProduct(new Scanner(line).nextInt()));
             }

             
        } catch (IOException e) {
            //throw new IllegalStateException("Gick inte att ladda favoriter",e);
        } 
        finally{
            try {
                r.close();
            } catch (Exception e) {}
        }
    }
    
    private void saveFavorites(){
        // Spara favoritlistan
        BufferedWriter w = null;
        try {
             w = new BufferedWriter(new FileWriter(handler.imatDirectory()+"/favorites.txt"));

             for(Product p : favorites){
                 w.write(p.getProductId()+" "+p.getName()+"\n");
             }
        } catch (IOException e) {
            throw new IllegalStateException("Gick inte att spara favoriter",e);
        }
        finally{
            try {
                w.close();
            } catch (Exception e) {
               //throw new IllegalStateException("Gick inte att spara favoriter",e);
            }
        }
    }

    public synchronized static IMatHandlerExtended getInstance() {
        if(instance == null){
            instance = new IMatHandlerExtended();
            handler = IMatDataHandler.getInstance();
            instance.loadFavorites();
        }
        
        return instance;
    }

    public void shutDown(){
        handler.shutDown();
        saveFavorites();
    }

    public Product getProduct(int id){
        return handler.getProduct(id);
    }

    private static Comparator<Product> productSorter = new Comparator<Product>() {
        public int compare(Product a, Product b) {
            boolean aIsFav = instance.isFavorite(a);
            boolean bIsFav = instance.isFavorite(b);

            // Om båda är favoriter eller ingen är favorit, jämför namn (^ = XOR)
            if(aIsFav ^ bIsFav){
                return a.getName().compareTo(b.getName());
            }
            else if(aIsFav){ // a är favorit, a först
                return 1;
            }
            else{ // b är favorit, b först
                return -1;
            }
        }
    };

    /**
     * Returnerar en sorterad lista med produkter från en subkategori att visa
     * @param c
     */
    public List<Product> getProducts(ProductCategory c){
        List<Product> products = handler.getProducts(c);
        Collections.sort(products,productSorter);
        return products;
    }

     /**
     * Returnerar en sorterad lista med produkter från en baskategori att visa
     * @param c
     */
    public List<Product> getProducts(BaseProductCategory bc){
        // Skapa lista med alla produkter i baskategorin        
        List<Product> products = new LinkedList<Product>();

        for(ProductCategory c : BaseProductCategory.getCategories(bc))
            products.addAll(handler.getProducts(c));

        Collections.sort(products,productSorter);
        return products;
    }

    public ImageIcon getImageIcon(Product p){
        if(handler.hasImage(p))
            return handler.getImageIcon(p);
        else // Ett frågetecken som bild om det inte finns en annan bild
            return new ImageIcon("question.png");
    }

    /*
    Behövs inte än

    public ImageIcon getImageIcon(Product p, Dimension d){
        return handler.getImageIcon(p, d);
    }

    public ImageIcon getImageIcon(Product p, int width, int height){
        return handler.getImageIcon(p, width, height);
    }*/
}
